home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / Interim Executive Decision / patch / qwe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-21  |  2.6 KB  |  129 lines  |  [TEXT/CWIE]

  1. #include <A4Stuff.h>
  2. #include <Gestalt.h>
  3. #include <Patches.h>
  4. #include <Resources.h>
  5. #include <TextUtils.h>
  6. #include <Types.h>
  7.  
  8. //============================================================================
  9.  
  10. pascal
  11. OSErr
  12. (*gOldGestalt)
  13. (
  14.     OSType                 selector:__D0,
  15.     long *                response:__A1
  16. ):__D0;
  17.  
  18. //============================================================================
  19.  
  20. static
  21. asm
  22. OSErr
  23. GestaltPatch
  24. (
  25.     OSType                 selector:__D0,
  26.     long *                response:__A1
  27. ):__D0;
  28.  
  29. static
  30. pascal
  31. OSErr
  32. myGestaltPatch
  33. (
  34.     OSType                 selector,
  35.     long *                response
  36. );
  37.  
  38. asm long SetUpA4(void);
  39.  
  40. //============================================================================
  41.  
  42. pascal
  43. OSErr
  44. myGestaltPatch
  45. (
  46.     OSType                 selector,
  47.     long *                response
  48. )
  49. {
  50.     OSErr                err = -1;
  51.     long                oldA4 = SetCurrentA4();
  52.  
  53. Debugger();
  54.     
  55.     SetA4(oldA4);
  56.  
  57.     return err;
  58. }
  59.  
  60. //============================================================================
  61.  
  62. static
  63. asm
  64. OSErr
  65. GestaltPatch
  66. (
  67.     OSType                 selector:__D0,
  68.     long *                response:__A1
  69. ):__D0
  70. {
  71.     move.l    A0,-(SP)            // Save registers
  72.     move.l    A1,-(SP)            // Save registers
  73.     move.l    A2,-(SP)            // Save registers
  74.     move.l    A4,-(SP)            // Save registers
  75.     move.l    D0,-(SP)            // Save registers
  76.     move.l    D1,-(SP)            // Save registers
  77.     move.l    D2,-(SP)            // Save registers
  78.  
  79.     clr.w    -(SP)                // Clear default result        
  80.     move.l    D0,-(SP)            // Push selector
  81.     move.l    A1,-(SP)            // Push response        
  82.     jsr        myGestaltPatch        // Call something higher level
  83.     move.w    (SP)+,D0            // Pop result
  84.     bne.s    allDone                // Did something; just return
  85.  
  86. realGestalt:
  87.  
  88.     move.l    (SP)+,A0            // Restore registers
  89.     move.l    (SP)+,A1            // Restore registers
  90.     move.l    (SP)+,A2            // Restore registers
  91.     move.l    (SP)+,A4            // Restore registers
  92.     move.l    (SP)+,D0            // Restore registers
  93.     move.l    (SP)+,D1            // Restore registers
  94.     move.l    (SP)+,D2            // Restore registers
  95.     jmp        gOldGestalt            // Call real gestalt
  96.  
  97. allDone:
  98.  
  99.     move.l    (SP)+,A0            // Restore registers
  100.     move.l    (SP)+,A1            // Restore registers
  101.     move.l    (SP)+,A2            // Restore registers
  102.     move.l    (SP)+,A4            // Restore registers
  103.     move.l    (SP)+,D0            // Restore registers
  104.     move.l    (SP)+,D1            // Restore registers
  105.     move.l    (SP)+,D2            // Restore registers
  106.  
  107.     rts                            // Return
  108. }
  109.  
  110. //============================================================================
  111.  
  112. void main (void)
  113. {
  114.     long            oldA4 = SetCurrentA4();
  115.  
  116.     gOldGestalt =
  117.         (pascal OSErr (*)(OSType selector:__D0, long* response:__A1):__D0)
  118.         NGetTrapAddress(0xA1AD, kOSTrapType);
  119.  
  120.     NSetTrapAddress((UniversalProcPtr)GestaltPatch, 0xA1AD, kOSTrapType);
  121.  
  122.     DetachResource(GetResource('INIT', 0));
  123.     
  124.     SetA4(oldA4);
  125. }
  126.  
  127. //============================================================================
  128.  
  129.